Python 函数式编程
什么是函数式编程
本节课我们将介绍函数式编程的特性。虽然我们没有称之为函数式编程,因为 Python 并非一门函数式编程语言。此外,查阅了许多 Python 编程书籍,在介绍 Python 函数式编程时,涉及的内容也相对较少,主要是介绍了函数式编程特性的几个函数 。因此,我们最终决定不将其称为函数式编程,因为该领域实在是太庞大了。因此,我们将只讨论函数式编程的特性。
在本节中,我们将主要介绍函数式编程的第一个特性:什么是函数式编程?函数式编程的定义是这样的:代码中的每一块都是不可变的,都由纯函数的形式组成。那么这里的纯函数指的是什么呢?纯函数就是指函数本身是相互独立的,互不影响。对于相同的输入,总会有相同的输出,而且没有任何副作用。虽然这样说有些晦涩,但我们将通过代码演示副作用是什么意思。
我们来创建一个名为 function_program 的 Python 文件。在这个文件中,我们将创建一个函数,该函数的作用是将列表中的每个元素都乘以2,即使它们加倍。我们将这个函数命名为 doubler,代码如下:
# 定义一个函数 doubler,参数为列表 l
def doubler(l):
# 遍历列表 l 中的每个元素,并对其进行操作
for item in range(0, len(l)):
# 将当前元素乘以2
l[item] *= 2
# 返回操作后的列表 l
return l
# 创建一个列表 list_value,包含元素 1、2、3、4、5
list_value = [1, 2, 3, 4, 5]
# 调用 doubler 函数,并输出结果
print(doubler(list_value))
输出结果:
[2, 4, 6, 8, 10]
运行结果是 2、4、6、8、10。接着我们再次调用这个函数,代码如下:
# 定义一个函数 doubler,参数为列表 l
def doubler(l):
# 遍历列表 l 中的每个元素,并对其进行操作
for item in range(0, len(l)):
# 将当前元素乘以2
l[item] *= 2
# 返回操作后的列表 l
return l
# 创建一个列表 list_value,包含元素 1、2、3、4、5
list_value = [1, 2, 3, 4, 5]
# 调用 doubler 函数,并输出结果
print(doubler(list_value))
print(doubler(list_value))
输出结果:
[2, 4, 6, 8, 10]
[4, 8, 12, 16, 20]
看到结果变成了4、8、12、16、20。这说明这个函数不符合函数式编 程的条件,因为对于相同的输入,两次输出的结果不同,这就产生了副作用。那么我们应该如何修改这段代码呢?我们使用函数式编程的方式来修改这个函数。我们再次定义 doubler,传递一个参数 l。在操作之前,我们首先创建一个新的空列表 new_list。然后,我们遍历列表l中的每个元素 item,将 item 乘以2,并将结果追加到 new_list 中。最后,我们返回这个新的列表 new_list。代码如下:
# 定义一个函数 doubler,参数为列表 l
def doubler(l):
# 创建一个新列表 new_list,用于存储处理后的结果
new_list = []
# 遍历列表 l 中的每个元素 item
for item in l:
# 将每个元素 item 乘以 2,并将结果追加到 new_list 中
new_list.append(item * 2)
# 返回处理后的新列表 new_list
return new_list
# 创建一个列表 list_value,包含元素 1、2、3、4、5
list_value = [1, 2, 3, 4, 5]
# 分别调用 doubler 函数两次,并输出结果
print(doubler(list_value))
print(doubler(list_value))
输出结果:
[2, 4, 6, 8, 10]
[2, 4, 6, 8, 10]
当我们再次调用这个函数时,输出的结果是一致的,没有产生副作用。至此,我们介绍了函数式编程的概念。如果你对函数式编程比较感兴趣,那么你可以学习一门函数式编程语言,比如 Lisp、Scala 等。在这里,我们主要介绍了函数式编程的特性,因为 Python 是支持函数式编程的。
函数式编程map()函数
下面我们将介绍函数式编程相关的三个函数:map
、filter
和 reduce
。首先,我们将总体了解这三个函数的作用。然后,我们将使用表情图描述来分别介绍它们的功能。
首先是 map
函数。map
函数接受两个参数:第一个参数是一个函数,称为 cook
;第二个参数是一个可迭代对象,比如列表或字典。map
函数的作用是将可迭代对象中的每个元素依次应用到 cook
函数上。例如,如果 cook
函数的功能是烹饪食物,那么 map
函数将列表中的每个元素传递给 cook
函数,并生成相应的食物。如下图所示: